//导入路由
import router from './router'

//导入获取token的方法
import { getToken } from './utils/auth'

//导入message提示信息
import { Message } from 'element-ui'

// 定义一个白名单
const whiteList = ['/404', '/login']

//导入store
import store from '@/store'

//导入进度条
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'

//设置路由的前置守卫
//to:需要跳转到的目标页面
//from:需要从哪个页面开始跳转
//next:下一步操作
router.beforeEach(async (to, from, next) => {
  //开启进度条
  NProgress.start()
  //(1)首先判断是否存在token
  //得到token
  const token = getToken()
  if (token) {
    //得到用户信息
    const userInfo = store.getters.userInfo
    //判断用户数据是否存在
    if (!userInfo.username) {
      //用户数据不存在，此时就需要获取到用户的数据
      const userInfo = await store.dispatch('user/getUserInfo')
      //路由的筛选
      const newRoutes = await store.dispatch(
        'permission/setRoutes',
        userInfo.roles.menus
      )
      //将动态路由动态添加到routes中
      router.addRoutes([
        ...newRoutes,
        { path: '*', redirect: '/404', hidden: true }   //手动添加404页面
      ]) // 404 page must be placed at the end !!!
      // 在这个导航守卫执行完成之后才会存在动态路由
      // 为了保存跳转之后路由能够正常加载，我们直接在这里转一个圈
      next(to.path)
    }
    //存在Token,此时需要进一步判断是否当前访问的页面是login页面
    if (to.path == '/login') {
      //(0)先给出提示信息
      Message.info('亲，您已经登录过了，无须重复操作哦！')
      //关闭进度条
      NProgress.done()
      //(1)如果访问的是登录页，则就直接让其跳转到主页
      next('/')
    } else {
      next()
    }
  } else {
    //不存在token时，此时就需要进一步判断是否是存在白名单中
    const res = whiteList.includes(to.path)
    if (res) {
      next()
    } else {
      //如果不在白名单中，则需要先给出提示信息，在跳转到登录页
      Message.info('亲，您还没有进行登录哦，请先登录再操作呢~')
      //跳转到登录页
      next(`/login?_redirect${to.path}`)
    }
  }
})

//后置守卫
// 导航后置守卫(当你真正进入到某个页面之后才执行)
router.afterEach((to, from) => {
  //关闭进度条
  NProgress.done()
})
